package com.hwtx.form.domain.chart;

import lombok.Data;
import com.fasterxml.jackson.annotation.JsonProperty;

/**
 * 代表ECharts折线图的主要配置选项。
 * 此类封装了配置ECharts折线图所需的所有主要属性。
 */
@Data
public class EChartsLineChartOptions {
    
    /**
     * 图表标题，包括主标题和副标题
     */
    private Title title;
    
    /**
     * 图例组件，显示不同系列
     */
    private Legend legend;
    
    /**
     * 提示框，当悬停在数据点上时显示信息
     */
    private Tooltip tooltip;
    
    /**
     * X轴配置
     */
    @JsonProperty("xAxis")
    private Axis xAxis;
    
    /**
     * Y轴配置
     */
    @JsonProperty("yAxis")
    private Axis yAxis;
    
    /**
     * 网格布局配置，用于图表区域
     */
    private Grid grid;
    
    /**
     * 系列数据配置 - 实际要显示的数据
     */
    private Series[] series;
    
    /**
     * 图表调色板
     */
    private String[] color;
    
    /**
     * 工具箱，包含保存图片、数据缩放等功能
     */
    private Toolbox toolbox;
    
    /**
     * 数据缩放组件，用于缩放功能
     */
    private DataZoom[] dataZoom;
    
    @Data
    public static class Title {
        /**
         * 主标题文本
         */
        private String text;
        
        /**
         * 副标题文本
         */
        private String subtext;
        
        /**
         * 水平对齐方式: 'left', 'center', 'right'
         */
        private String left;
        
        /**
         * 垂直对齐方式: 'top', 'middle', 'bottom'
         */
        private String top;
        
        /**
         * 文本样式配置
         */
        private TextStyle textStyle;
    }
    
    @Data
    public static class Legend {
        /**
         * 布局方向: 'horizontal', 'vertical'
         */
        private String orient;
        
        /**
         * 水平位置: 'left', 'center', 'right'
         */
        private String left;
        
        /**
         * 垂直位置: 'top', 'middle', 'bottom'
         */
        private String top;
        
        /**
         * 图例名称数组，与系列名称对应
         */
        private String[] data;
    }
    
    @Data
    public static class Tooltip {
        /**
         * 触发类型: 'item', 'axis', 'none'
         */
        private String trigger;
        
        /**
         * 自定义提示框内容格式化器
         */
        private String formatter;
    }
    
    @Data
    public static class Axis {
        /**
         * 轴类型: 'value', 'category', 'time', 'log'
         */
        private String type;
        
        /**
         * 类目轴的类目数据
         */
        private Object[] data;
        
        /**
         * 轴名称
         */
        private String name;
        
        /**
         * 轴的最小值
         */
        private Object min;
        
        /**
         * 轴的最大值
         */
        private Object max;
        
        /**
         * 轴的分割段数
         */
        private Integer splitNumber;
        
        /**
         * 轴线配置
         */
        private AxisLine axisLine;
        
        /**
         * 轴标签配置
         */
        private AxisLabel axisLabel;
        
        /**
         * 类目轴两端留白
         */
        private Boolean boundaryGap;
    }
    
    @Data
    public static class Grid {
        /**
         * 网格左边距
         */
        private Object left;
        
        /**
         * 网格右边距
         */
        private Object right;
        
        /**
         * 网格上边距
         */
        private Object top;
        
        /**
         * 网格下边距
         */
        private Object bottom;
        
        /**
         * 网格是否包含坐标轴标签
         */
        private Boolean containLabel;
    }
    
    @Data
    public static class Series {
        /**
         * 系列名称，与图例对应
         */
        private String name;
        
        /**
         * 图表类型: 'line' 表示折线图
         */
        private String type;
        
        /**
         * 系列数据
         */
        private Object[] data;
        
        /**
         * 数据点标记类型
         */
        private String symbol;
        
        /**
         * 折线是否平滑
         */
        private Boolean smooth;
        
        /**
         * 线条样式配置
         */
        private LineStyle lineStyle;
        
        /**
         * 数据点样式
         */
        private ItemStyle itemStyle;
        
        /**
         * 区域样式（用于面积图）
         */
        private AreaStyle areaStyle;
        
        /**
         * 标记点配置
         */
        private MarkPoint markPoint;
        
        /**
         * 标记线配置
         */
        private MarkLine markLine;
    }
    
    @Data
    public static class LineStyle {
        /**
         * 线条宽度
         */
        private Integer width;
        
        /**
         * 线条颜色
         */
        private String color;
        
        /**
         * 线条类型: 'solid', 'dashed', 'dotted'
         */
        private String type;
        
        /**
         * 线条透明度
         */
        private Double opacity;
    }
    
    @Data
    public static class ItemStyle {
        /**
         * 数据点颜色
         */
        private String color;
        
        /**
         * 数据点边框颜色
         */
        private String borderColor;
        
        /**
         * 数据点边框宽度
         */
        private Integer borderWidth;
        
        /**
         * 数据点透明度
         */
        private Double opacity;
    }
    
    @Data
    public static class AreaStyle {
        /**
         * 区域填充颜色
         */
        private String color;
        
        /**
         * 区域透明度
         */
        private Double opacity;
    }
    
    @Data
    public static class MarkPoint {
        /**
         * 标记点数据
         */
        private MarkPointData[] data;
    }
    
    @Data
    public static class MarkPointData {
        /**
         * 标记点类型
         */
        private String type;
        
        /**
         * 标记点名称
         */
        private String name;
    }
    
    @Data
    public static class MarkLine {
        /**
         * 标记线数据
         */
        private MarkLineData[] data;
    }
    
    @Data
    public static class MarkLineData {
        /**
         * 标记线类型
         */
        private String type;
        
        /**
         * 标记线名称
         */
        private String name;
    }
    
    @Data
    public static class AxisLine {
        /**
         * 是否显示轴线
         */
        private Boolean show;
        
        /**
         * 线条样式配置
         */
        private LineStyle lineStyle;
    }
    
    @Data
    public static class AxisLabel {
        /**
         * 标签旋转角度
         */
        private Integer rotate;
        
        /**
         * 标签显示间隔
         */
        private Object interval;
        
        /**
         * 标签文本样式
         */
        private TextStyle textStyle;
    }
    
    @Data
    public static class TextStyle {
        /**
         * 字体颜色
         */
        private String color;
        
        /**
         * 字体大小
         */
        private Integer fontSize;
        
        /**
         * 字体系列
         */
        private String fontFamily;
        
        /**
         * 字体粗细
         */
        private String fontWeight;
    }
    
    @Data
    public static class Toolbox {
        /**
         * 工具箱功能配置
         */
        private Feature feature;
        
        @Data
        public static class Feature {
            /**
             * 保存为图片功能
             */
            private SaveAsImage saveAsImage;
            
            /**
             * 数据区域缩放功能
             */
            private DataZoomFeature dataZoom;
            
            /**
             * 重置功能
             */
            private Restore restore;
            
            @Data
            public static class SaveAsImage {
                /**
                 * 是否显示保存为图片按钮
                 */
                private Boolean show;
                
                /**
                 * 保存为图片按钮的标题
                 */
                private String title;
            }
            
            @Data
            public static class DataZoomFeature {
                /**
                 * 是否显示数据区域缩放按钮
                 */
                private Boolean show;
                
                /**
                 * 数据区域缩放按钮的标题
                 */
                private String title;
            }
            
            @Data
            public static class Restore {
                /**
                 * 是否显示重置按钮
                 */
                private Boolean show;
                
                /**
                 * 重置按钮的标题
                 */
                private String title;
            }
        }
    }
    
    @Data
    public static class DataZoom {
        /**
         * 数据缩放类型: 'inside', 'slider'
         */
        private String type;
        
        /**
         * 数据缩放开始百分比
         */
        private Integer start;
        
        /**
         * 数据缩放结束百分比
         */
        private Integer end;
    }
}